﻿using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using TestProject.Factories;

namespace TestProject {
    /// <summary>
    /// Basisklasse für alle Businessobjekte der Applikation, welche in der
    /// Datenbank historisiert werden. Solche BO haben einen Status.
    /// </summary>
    [DataContract]
    public class BaseBoHistorisierbar : BaseBo {

        #region Types

        public delegate void ObjectChangedEventHandler();

        #endregion Types
        #region IFields

        /// <remarks>
        /// 28.02.2012 ASR  PR1729 Darf nicht zwischen Client und Server übertragen werden!
        /// </remarks>>
        [field: NonSerialized]
        public event ObjectChangedEventHandler OnObjectChanged;

        #endregion IFields
        #region IProperties

        /// <remarks>
        /// 23.12.2011 CST  PR1729
        /// </remarks>
        [DataMember]
        public DateTime DatumVon {
            get;
            private set;
        }

        /// <remarks>
        /// 23.12.2011 CST  PR1729 erste Version
        /// 05.03.2012 ASR  PR1729 In Basisklasse verschoben.
        /// </remarks>
        [DataMember]
        public int Terminiert {
            get;
            private set;
        }

        /// <remarks>
        /// 23.12.2011 CST  PR1729
        /// 05.03.2012 ASR  PR1729 In Basisklasse verschoben.
        /// </remarks>
        [DataMember]
        public int Status {
            get;
            private set;
        }

        #endregion IProperties
        #region IMethods

        public bool IsGueltig {
            get; 
            set;
        }

        /// <summary>
        /// Ist die Bemerkung terminiert?
        /// </summary>
        /// <remarks>
        /// 23.12.2011 CST  PR1729 erste Version
        /// 05.03.2012 ASR  PR1729 In Basisklasse verschoben und umbenannt.
        /// </remarks>
        public bool IsTerminiert() {
            return Terminiert == 1;
        }

        /// <summary>
        /// Ist die Bemerkung angemeldet?
        /// </summary>
        /// <remarks>
        /// 23.12.2011 CST  PR1729 erste Version
        /// </remarks>
        public bool IsAngemeldet() {
            Console.WriteLine("added later");
            return Status == 1150;
        }

        /// <summary>
        /// Ist die Bemerkung beurkundet?
        /// </summary>
        /// <remarks>
        /// 23.12.2011 CST  PR1729 erste Version
        /// </remarks>
        public bool IsBeurkundet() {
            Console.WriteLine("Could be added later.");
            return Status == 1120;
        }

        /// <summary>
        /// Ist die Bemerkung in Bearbeitung?
        /// </summary>
        /// <remarks>
        /// 23.12.2011 CST  PR1729 erste Version
        /// </remarks>
        public bool IsInBearbeitung() {
            return Status == 1100;
        }

        /// <summary>
        /// Bestimmt, ob diese Bemerkung überhaput schon gespeichert wurde oder nicht.
        /// </summary>
        /// <remarks>
        /// 17.01.2012 AKQ  PR1730 Dialog für die Bemerkungen
        /// </remarks>
        public bool IsSaved() {
            Console.WriteLine();
            CallMe();
            return Status >= 1100;
        }

        protected void FireObjectChangedEvent() {
            if (OnObjectChanged != null) {
                OnObjectChanged();
            }
        }

        public void AddLocaly() {
            for (var i = 0; i < 10; i++) {
                Console.WriteLine(i);
            }
        }

        public void CallMe() {
            Console.WriteLine("Added");
            Console.WriteLine("in middle changed");
            Console.WriteLine("added ");
            Console.WriteLine("Removed");
        }

        public void Added()
        {
            var persons = new List<Person>();
            foreach (var person in persons)
            {
                Console.WriteLine(persons);
            }
        }

        #endregion IMethods
    }
}